import java.util.Arrays;

public class LinkedListDelete {
    public static void main(String[] args) {
        //1、初始化链表 1 -> 3 -> 2 -> 5 -> 4
        ListNode node0 = new ListNode(1);  //初始化各个链表节点
        ListNode node1 = new ListNode(3);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(5);
        ListNode node4 = new ListNode(4);

        node0.next = node1;  //构建节点之间的引用
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;

        //2、删除第index个元素验证
        ListNode newlistNode = deleteByIndex(3, node0);
        int[] linkededListToArray = LinkedListToArray.linkedListToArray(newlistNode);
        System.out.println(Arrays.toString(linkededListToArray)); //[1, 3, 2, 4]

        //3、删除值为val的元素
        ListNode listNode = deleteByValue(2, node0);
        LinkedListDisplay.display(listNode); //1->3->5->4
    }

    //删除第index个元素
    // 找到第index-1个节点，将其直接指向第index+1个节点即可。
    // 需要注意空链表或者越界情况。
    public static ListNode deleteByIndex(int index,ListNode headNode){
        //1、处理异常情况 - 空链表、越界
        int[] linkedListArray = LinkedListToArray.linkedListToArray(headNode);
        int size = linkedListArray.length; //获得链表长度
        if(index > size || headNode == null){
            System.out.println("越界 或 空链表");
            return null;
        }
        //2、处理删除index为头部节点的元素
        if(index == 0){ //删除头节点的元素，直接把头结点赋值给第二个元素即可
            headNode = headNode.next;
            return headNode;
        }
        //2、处理删除内部index位置的元素
        ListNode previousNode = headNode; //创建一个指向头节点的指针
        for (int i = 0; i < (index - 1); i++) {
            previousNode = previousNode.next; //关键是找到删除位置的前一个节点
        }
        previousNode.next = previousNode.next.next; //要删除的元素的前一个节点的next指针指向下一个节点，完成删除
        return headNode;
    }

    //删除值为val的元素
    public static ListNode deleteByValue(int val, ListNode headNode){
        //1、处理异常情况 - 空链表
        if(headNode == null){
            System.out.println("空链表");
            return null;
        }
        //2、处理删除头部节点的元素
        if(val == headNode.val){
            headNode = headNode.next;
            return headNode;
        }
        //3、处理删除内部值为val的元素
        ListNode previousNode = headNode;      //创建指针，指向被操作的节点的前一位
        ListNode currentNode = headNode.next;  //创建指针，指向被操作的节点
        while (currentNode != null){
            if(currentNode.val == val){
                previousNode.next = currentNode.next;
            }else{
                previousNode = currentNode;
            }
            currentNode = currentNode.next;
        }
        return headNode;
    }
}
